////  Copyright Fernando Pelliccioni 2011 - 2012. Use, modification and
////  distribution is subject to the Boost Software License, Version
////  1.0. (See accompanying file LICENSE_1_0.txt or copy at
////  http://www.boost.org/LICENSE_1_0.txt)
////
//// For more information, see http://www.boost.org/libs/range/
////
//
//#ifndef BOOST_RANGE_ADAPTOR_BOUNDED_HPP
//#define BOOST_RANGE_ADAPTOR_BOUNDED_HPP
//
//#include <boost/range/adaptor/argument_fwd.hpp>
//#include <boost/range/size_type.hpp>
//#include <boost/range/iterator_range.hpp>
//
//namespace boost
//{
//    namespace adaptors
//    {
//        struct bounded
//        {
//            bounded(std::size_t t_, std::size_t u_)
//                : t(t_), u(u_) {}
//            std::size_t t;
//            std::size_t u;
//        };
//
//        template< class RandomAccessRange >
//        class bounded_range : public boost::iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<RandomAccessRange>::type >
//        {
//            typedef boost::iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<RandomAccessRange>::type > base_t;
//        public:
//            template<typename Rng, typename T, typename U>
//            bounded_range(Rng& rng, T t, U u)
//                : base_t(boost::make_iterator_range(rng, t, u - boost::size(rng)))
//            {
//            }
//        };
//
//        template< class RandomAccessRange >
//        inline bounded_range<RandomAccessRange>
//        bound( RandomAccessRange& rng, std::size_t t, std::size_t u )
//        {
//            BOOST_ASSERT( t <= u && "error in bound indices" );
//            BOOST_ASSERT( static_cast<std::size_t>(boost::size(rng)) >= u &&
//                          "second bound index out of bounds" );
//
//            return bounded_range<RandomAccessRange>(rng, t, u);
//        }
//
//        template< class RandomAccessRange >
//        inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<const RandomAccessRange>::type >
//        bound( const RandomAccessRange& rng, std::size_t t, std::size_t u )
//        {
//            BOOST_ASSERT( t <= u && "error in bound indices" );
//            BOOST_ASSERT( static_cast<std::size_t>(boost::size(rng)) >= u &&
//                          "second bound index out of bounds" );
//
//            return bounded_range<const RandomAccessRange>(rng, t, u);
//        }
//
//        template< class RandomAccessRange >
//        inline bounded_range<RandomAccessRange>
//        operator|( RandomAccessRange& r, const bounded& f )
//        {
//            return bounded_range<RandomAccessRange>( r, f.t, f.u );
//        }
//
//        template< class RandomAccessRange >
//        inline bounded_range<const RandomAccessRange>
//        operator|( const RandomAccessRange& r, const bounded& f )
//        {
//            return bounded_range<const RandomAccessRange>( r, f.t, f.u );
//        }
//
//    } // namespace adaptors
//    using adaptors::bounded_range;
//} // namespace boost
//
//#endif
